package com.xuecheng.content.controller;

import com.xuecheng.api.content.CourseBaseApi;
import com.xuecheng.api.content.model.dto.CourseBaseDTO;
import com.xuecheng.api.content.model.qo.QueryCourseModel;
import com.xuecheng.api.content.model.vo.CourseBaseVO;
import com.xuecheng.common.domain.page.PageRequestParams;
import com.xuecheng.common.domain.page.PageVO;
import com.xuecheng.common.util.SecurityUtil;
import com.xuecheng.content.convert.CourseBaseConvert;
import com.xuecheng.content.entity.CourseBase;
import com.xuecheng.content.service.CourseBaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 课程基本信息 前端控制器
 * </p>
 *
 * @author itcast
 */
@Slf4j
@RestController
@RequestMapping("courseBase")
public class CourseBaseController implements CourseBaseApi {

    @Autowired
    private CourseBaseService  courseBaseService;

    /**
     * 查询所有
     *v
     * @return {@link List}<{@link CourseBase}>
     * 实现 Api 中的接口
     */
    @Override
    @GetMapping("/course/all")
    public List<CourseBase> queryAll(){
        List<CourseBase> courseBases = courseBaseService.queryAll();
        return courseBases;
    }

    /**
     * 分页条件查询课程基本信息
     *
     * @param params 分页参数
     * @param model  查询请求参数
     * @return com.xuecheng.common.domain.page.PageVO
     * @author Lily
     * @date 2021/12/8 20:35
     * @paramType [com.xuecheng.common.domain.page.PageRequestParams, com.xuecheng.api.content.model.qo.QueryCourseModel]
     * @description
     */
    @Override
    @PostMapping("course/list")
    public PageVO queryCourseList(PageRequestParams params, QueryCourseModel model) {

        //TODO 为了不更改前端代码，因此不添加 companyId 的参数
        Long companyId = SecurityUtil.getCompanyId();

        PageVO pageVO = courseBaseService.queryCourseBaseList(params, model, companyId);

        return pageVO;
    }

    /**
     * 创建基础课程内容
     *
     * @param courseBaseVO CourseBaseVO 前端传递过来的数据
     * @return com.xuecheng.api.content.model.dto.CourseBaseDTO
     * @author Lily
     * @date 2021/12/11 16:25
     * @paramType [com.xuecheng.api.content.model.vo.CourseBaseVO]
     * @description
     * 业务分析：
     *      1 先将 vo转换成 dto
     *      2 回去公司 id并赋值给 dto
     *      3 将数据返回给前端
     */
    @PostMapping("course")
    @Override
    //TODO 如果请求是请求体，需要给参数打上 @RequestBody
    public CourseBaseDTO createCourseBase(@RequestBody CourseBaseVO courseBaseVO) {

        CourseBaseDTO courseBaseDTO = getCourseBaseDTO(courseBaseVO);

        //3 将数据返回给前端
        return courseBaseService.createCourseBase(courseBaseDTO);
    }


    //业务分析：
    //     1 先将 vo转换成 dto
    //     2 获取公司 id并赋值给 dto
    //     3 将数据返回给前端
    private CourseBaseDTO getCourseBaseDTO(CourseBaseVO courseBaseVO) {
        //1 先将 vo转换成 dto
        CourseBaseDTO courseBaseDTO = CourseBaseConvert.INSTANCE.vo2dto(courseBaseVO);


        //2 回去公司 id并赋值给 dto
        Long companyId = SecurityUtil.getCompanyId();
        courseBaseDTO.setCompanyId(companyId);
        return courseBaseDTO;
    }


    /**
     * 修改基础课程内容
     *
     * @param courseBaseVO CourseBaseVO 前端传递过来的数据
     * @return com.xuecheng.api.content.model.dto.CourseBaseDTO
     * @author Lily
     * @date 2021/12/11 16:25
     * @paramType [com.xuecheng.api.content.model.vo.CourseBaseVO]
     * @description
     * 业务分析：
     *      1 先将 vo转换成 dto
     *      2 获取公司 id并赋值给 dto
     *      3 将数据返回给前端
     */
    @PutMapping("course")
    @Override
    public CourseBaseDTO modifyCourseBase(@RequestBody CourseBaseVO courseBaseVO) {

        CourseBaseDTO courseBaseDTO = getCourseBaseDTO(courseBaseVO);

        return courseBaseService.modifyCourseBase(courseBaseDTO);
    }


    /**
     * 删除课程基础
     *
     * @param courseBaseId 课程基础id
     * @author Lily
     * @date 2021/12/11 22:56
     * @paramType [java.lang.Long]
     * @description
     * 路径中要加上 PathVariable 注解
     * 删除只能删除自己的机构的课程
     */
    @DeleteMapping("course/{courseBaseId}")
    @Override
    public void removeCourseBase(@PathVariable Long courseBaseId) {
        //获取公司id
        Long companyId = SecurityUtil.getCompanyId();
        courseBaseService.removeCourseBase(courseBaseId, companyId);
    }


    /**
     * 提交课程基础
     *
     * @param courseBaseId 课程基础id
     * @author Lily
     * @date 2021/12/13 20:10
     * @paramType [java.lang.Long]
     * @description
     *
     * 路径参数，参数名必须和方法的形参相同
     */
    @GetMapping("course/commit/{courseBaseId}")
    @Override
    public void commitCourseBase(@PathVariable Long courseBaseId) {
        Long companyId = SecurityUtil.getCompanyId();
        courseBaseService.commitCourseBase(courseBaseId, companyId);
    }


}
